package cn.edu.ncut.cs.springboot.petmanagementsystem.service.Impl;

import cn.edu.ncut.cs.springboot.petmanagementsystem.mapper.ProductMapper;
import cn.edu.ncut.cs.springboot.petmanagementsystem.pojo.Product;
import cn.edu.ncut.cs.springboot.petmanagementsystem.service.ProductService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Slf4j
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Override
    public IPage<Product> getProductList(Integer pageNum, Integer pageSize, Long categoryId, String category, String productName) {
        log.info("查询商品列表 - pageNum: {}, pageSize: {}, categoryId: {}, category: {}, productName: {}", 
                pageNum, pageSize, categoryId, category, productName);
        
        Page<Product> page = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
        
        // 支持通过categoryId查询
        if (categoryId != null) {
            log.info("使用 categoryId 查询: {}", categoryId);
            wrapper.eq(Product::getCategoryId, categoryId);
        }
        // 支持通过category字符串查询（如果不是"all"且没有提供categoryId）
        else if (StringUtils.hasText(category) && !"all".equalsIgnoreCase(category)) {
            // 检查是否是特殊的子分类（狗粮、猫粮）
            String subCategoryKeyword = getSubCategoryKeyword(category);
            if (subCategoryKeyword != null) {
                // 使用商品名称模糊查询
                log.info("使用子分类关键词模糊查询: {}", subCategoryKeyword);
                wrapper.like(Product::getProductName, subCategoryKeyword);
            } else {
                // 建立category字符串到categoryId的映射
                Long mappedCategoryId = getCategoryIdByName(category);
                if (mappedCategoryId != null) {
                    log.info("分类名称 '{}' 映射为 categoryId: {}", category, mappedCategoryId);
                    wrapper.eq(Product::getCategoryId, mappedCategoryId);
                } else {
                    log.warn("无法映射分类名称: {}", category);
                }
            }
        }
        
        if (StringUtils.hasText(productName)) {
            log.info("按商品名称模糊查询: {}", productName);
            wrapper.like(Product::getProductName, productName);
        }
        wrapper.eq(Product::getProductStatus, 1); // 只查询上架商品
        wrapper.orderByDesc(Product::getCreateTime);
        
        IPage<Product> result = productMapper.selectPage(page, wrapper);
        log.info("查询结果 - 总记录数: {}, 当前页: {}, 每页数量: {}, 总页数: {}", 
                result.getTotal(), result.getCurrent(), result.getSize(), result.getPages());
        
        return result;
    }
    
    /**
     * 获取子分类关键词（用于商品名称模糊查询）
     * 针对狗粮、猫粮这类特殊子分类，返回用于模糊查询的关键词
     * @param category 分类名称
     * @return 子分类关键词，如果不是子分类则返回null
     */
    private String getSubCategoryKeyword(String category) {
        if (category == null) {
            return null;
        }
        
        String lowerCaseName = category.toLowerCase().trim();
        
        // 狗粮
        if (lowerCaseName.equals("狗粮") || 
            lowerCaseName.equals("dog-food") || 
            lowerCaseName.equals("dogfood") ||
            lowerCaseName.equals("狗")) {
            return "狗粮";
        }
        
        // 猫粮
        if (lowerCaseName.equals("猫粮") || 
            lowerCaseName.equals("cat-food") || 
            lowerCaseName.equals("catfood") ||
            lowerCaseName.equals("猫")) {
            return "猫粮";
        }
        
        return null;
    }
    
    /**
     * 根据分类名称获取分类ID
     * 分类映射规则：
     * - 食品类 (categoryId=1): 宠物食品（狗粮和猫粮使用子分类查询）
     * - 玩具类 (categoryId=2): 包含互动玩具、益智玩具、运动玩具等
     * - 日用品类 (categoryId=3): 包含喂养用品、清洁用品、护理工具等
     * - 医疗保健类 (categoryId=4): 包含驱虫药、营养品、护理用品等
     * 
     * 注意：狗粮、猫粮使用子分类关键词模糊查询，不使用 categoryId
     */
    private Long getCategoryIdByName(String categoryName) {
        if (categoryName == null) {
            return null;
        }
        
        // 转换为小写进行匹配
        String lowerCaseName = categoryName.toLowerCase().trim();
        
        // 食品类 (categoryId=1) - 不包含具体的狗粮、猫粮关键词
        if (lowerCaseName.equals("food") || 
            lowerCaseName.equals("食品") || 
            lowerCaseName.equals("宠物食品")) {
            return 1L;
        }
        
        // 玩具类 (categoryId=2)
        if (lowerCaseName.equals("toy") || 
            lowerCaseName.equals("玩具") || 
            lowerCaseName.equals("玩具用品") ||
            lowerCaseName.equals("宠物玩具")) {
            return 2L;
        }
        
        // 日用品类 (categoryId=3)
        if (lowerCaseName.equals("daily") || 
            lowerCaseName.equals("日用品") || 
            lowerCaseName.equals("日常用品") ||
            lowerCaseName.equals("用品")) {
            return 3L;
        }
        
        // 医疗保健类 (categoryId=4)
        if (lowerCaseName.equals("health") || 
            lowerCaseName.equals("医疗") || 
            lowerCaseName.equals("保健") ||
            lowerCaseName.equals("医疗保健") ||
            lowerCaseName.equals("healthcare")) {
            return 4L;
        }
        
        log.warn("未知的category类型: {}", categoryName);
        return null;
    }

    @Override
    public Product getProductById(Long id) {
        if (id == null) {
            return null;
        }
        return productMapper.selectById(id);
    }

    @Override
    public java.util.List<java.util.Map<String, Object>> getProductCategories() {
        try {
            // 查询所有商品分类及其商品数量
            return productMapper.getProductCategories();
        } catch (Exception e) {
            log.error("获取商品分类列表失败", e);
            return java.util.List.of();
        }
    }

    @Override
    public java.util.List<Product> getHotProducts(Integer limit) {
        if (limit == null || limit <= 0) {
            limit = 10;
        }
        
        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Product::getProductStatus, 1); // 只查询上架商品
        wrapper.orderByDesc(Product::getSoldQuantity); // 按销量排序
        wrapper.last("LIMIT " + limit);
        
        return productMapper.selectList(wrapper);
    }

    @Override
    public java.util.List<Product> getRecommendProducts(Integer limit) {
        if (limit == null || limit <= 0) {
            limit = 10;
        }
        
        // 推荐逻辑：综合考虑销量、评分、浏览量等
        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Product::getProductStatus, 1); // 只查询上架商品
        wrapper.orderByDesc(Product::getSoldQuantity); // 可以根据需要调整推荐算法
        wrapper.orderByDesc(Product::getViewCount);
        wrapper.last("LIMIT " + limit);
        
        return productMapper.selectList(wrapper);
    }

    @Override
    public Boolean checkStock(Long id, Integer quantity) {
        if (id == null || quantity == null || quantity <= 0) {
            return false;
        }
        
        Product product = productMapper.selectById(id);
        if (product == null) {
            log.warn("商品不存在，ID: {}", id);
            return false;
        }
        
        // 检查库存是否充足
        return product.getStockQuantity() != null && product.getStockQuantity() >= quantity;
    }
}
